package com.coder4j.starter.web;

import com.coder4j.starter.mybatis.BasePage;
import com.coder4j.starter.mybatis.BaseQuery;
import lombok.NonNull;

import java.util.List;

public interface IBaseService<T,V> {

    /**
     * 保存数据
     * 有id，更新；没id，新增
     * @param entity
     * @return
     */
    T baseSave(T entity);


    /**
     * 保存数据，传入VO对象，调用 service.vo2Entity 方法转成 entity 对象
     * 有id，更新；没id，新增
     * @param vo
     * @return
     */
    V baseSaveVO(V vo);

    /**
     * 批量保存，只支持添加
     * @param list
     * @return
     */
    int baseSaveList(List<T> list);

    /**
     * 批量保存
     * @param voList
     * @return
     */
    int baseSaveVoList(List<V> voList);

    /**
     * 根据ID查询entity对象
     * @param id
     * @return
     */
    T baseGetById(@NonNull Object id);

    List<T> baseGetListByIds(List ids);

    /**
     * 根据ID查询
     * @param id
     * @return
     */
    V baseGetVOById(@NonNull Object id);

    /**
     * 根据ID删除
     * @param id
     * @return
     */
    int baseDeleteById(Object id);

    int baseDeleteByIds(List ids);

    /**
     * 根据Id更新数据
     * @param entity
     * @return
     */
    int baseUpdateById(T entity);

    /**
     * 批量更新
     * @param entity
     * @param ids
     * @return
     */
    int baseUpdateByIds(T entity, List ids);

    T baseQueryOne(BaseQuery<T> query);

    V baseQueryOneVO(BaseQuery<T> query);

    /**
     * 分页查询
     * @param query
     * @return
     */
    BasePage<T> baseQueryPage(BaseQuery<T> query);

    int baseQueryCount(BaseQuery<T> query);

    /**
     * 查询列表，不分页
     * @param query
     * @return
     */
    List<T> baseQueryList(BaseQuery<T> query);

    /**
     * 分页查询
     * @param query
     * @return
     */
    BasePage<V> baseQueryVOPage(BaseQuery<T> query);

    /**
     * 查询列表，不分页
     * @param query
     * @return
     */
    List<V> baseQueryVOList(BaseQuery<T> query);

    /**
     * 转换树型结构
     * @param root  根节点
     * @param list  数据列表
     */
     <K extends BaseTreeVO> void  baseInitChildren(K root, List<K> list);
}
